from ruamel.yaml import YAML

def flatten_dict(d, parent_key=''):
    """
    递归展开字典，将嵌套的键合并为用点分隔的形式，同时获取可能的 inline 注释。
    返回一个字典：键为展开后的参数名称，值为 (value, desc) 二元组。
    """
    items = {}
    for k, v in d.items():
        # 生成展开后的参数名称
        new_key = f"{parent_key}.{k}" if parent_key else k

        # 尝试获取该键对应的 inline 注释
        desc = ""
        if hasattr(d, 'ca') and k in d.ca.items:
            comment_tuple = d.ca.items[k]
            # 注释通常存放在该 tuple 的第三个元素（索引 2），可能为 None
            if len(comment_tuple) > 2 and comment_tuple[2] is not None:
                inline_comment = comment_tuple[2]
                # inline_comment 可能是一个 CommentToken 对象
                if hasattr(inline_comment, 'value'):
                    desc = inline_comment.value.strip()
                else:
                    desc = str(inline_comment).strip()
                # 如有必要，移除前导的 '#' 符号
                if desc.startswith('#'):
                    desc = desc.lstrip('#').strip()

        # 如果值为字典，则递归展开；否则直接保存
        if isinstance(v, dict):
            nested_items = flatten_dict(v, new_key)
            items.update(nested_items)
        else:
            items[new_key] = (v, desc)
    return items

def parse_parameters_file(file_path):
    """
    解析参数 YAML 文件，查找 /monitor 下 ros__parameters 部分，
    将参数展开为平铺的形式，并生成字符串
    格式：Param<type>("parameter_name", default_value, "desc")
    """
    parameters = []
    yaml=YAML(typ='rt')  # 使用 RoundTrip 以保留注释
    with open(file_path, 'r') as f:
        config = yaml.load(f)

    # 假定 YAML 文件结构类似：
    # /monitor:
    #   ros__parameters:
    #     key1: value1       # 注释信息
    #     key2:
    #       subkey: value2   # 注释信息
    parameters_section = {}
    # 查找顶层 key 对应为 "/monitor" 的部分，并获取 ros__parameters 子部分
    for root_key, root_value in config.items():
        if isinstance(root_value, dict) and 'ros__parameters' in root_value:
            parameters_section = root_value['ros__parameters']
            break

    # 展开嵌套字典，保留每个参数的注释信息
    flat_params = flatten_dict(parameters_section)
    for name, (default, desc) in flat_params.items():
        param_type = type(default).__name__
        # 使用 repr(default) 以确保字符串会带引号
        parameters.append(f'Param<{param_type}>("{name}", {default!r}, "{desc}")')
    return parameters

if __name__ == '__main__':
    file_path = "parameters.yaml"  # 这里填写你的 YAML 参数文件路径
    params = parse_parameters_file(file_path)
    for param in params:
        print(param)
